#include "cbb_bit.h"
#include <string.h>

/* 1. 类型字节数：BIT_8→1，BIT_16→2，BIT_32→4 */
static const uint8_t u8ByteSize[] = { 1, 2, 4 };

uint8_t 
cbb_get_bit(void* pvValue, uint8_t u8Type, uint8_t bit){

    // 输入参数检查
    if(NULL == pvValue || 8*u8ByteSize[u8Type] <= bit || BIT_INVALID <= u8Type) return 0;

    // 把数据加载到 32 位变量（自动零扩展）
    uint32_t u32Value = 0;
    memcpy(&u32Value, pvValue, u8ByteSize[u8Type]);
    
    // 获取事件位
    uint8_t u8Ret = (u32Value >> bit) & 0x01;

    // 返回事件位
    return u8Ret;
}

uint8_t cbb_clear_bit(void *pvValue, uint8_t u8Type, uint8_t bit)
{
    // 输入参数检查
    if (pvValue == NULL || 8*u8ByteSize[u8Type] <= bit || BIT_INVALID <= u8Type) return 0;

    // 把数据加载到 32 位变量（自动零扩展）
    uint32_t u32Value = 0;
    memcpy(&u32Value, pvValue, u8ByteSize[u8Type]);

    // 清除事件位
    u32Value &= ~(1u << bit); 
    memcpy(pvValue, &u32Value, u8ByteSize[u8Type]);

    // 执行成功
    return 1;
}

uint8_t 
cbb_set_bit(void* pvValue, uint8_t u8Type, uint8_t bit){

    // 输入参数检查
    if (pvValue == NULL || 8*u8ByteSize[u8Type] <= bit || BIT_INVALID <= u8Type) return 0;

    // 把数据加载到 32 位变量（自动零扩展）
    uint32_t u32Value = 0;
    memcpy(&u32Value, pvValue, u8ByteSize[u8Type]);
    
    // 设置事件位
    u32Value |= (1u << bit);       
    memcpy(pvValue, &u32Value, u8ByteSize[u8Type]);
    return 1;

    // 执行成功
    return 1;
}
